/**
 * 工厂模式 (Factory Pattern)
 * 形状工厂类，用于创建不同类型的形状对象
 */
class ShapeFactory {
  /**
   * 构造函数
   * 初始化工厂
   */
  constructor() {
    // TODO: 初始化工厂
  }

  /**
   * 创建形状
   * @param {string} type - 形状类型
   * @param {...any} args - 形状构造参数
   * @returns {Shape} 创建的形状对象
   */
  createShape(type, ...args) {
    // TODO: 根据类型创建不同的形状对象
    // 提示：支持 'circle', 'rectangle', 'triangle' 等类型
  }

  /**
   * 注册新的形状类型
   * @param {string} type - 形状类型名称
   * @param {Function} ShapeClass - 形状类构造函数
   */
  registerShape(type, ShapeClass) {
    // TODO: 允许动态注册新的形状类型
  }

  /**
   * 获取支持的所有形状类型
   * @returns {string[]} 所有支持的形状类型数组
   */
  getSupportedTypes() {
    // TODO: 返回所有支持的形状类型
  }
}

/**
 * 基础形状类
 * 所有形状的基类，定义形状的基本接口
 */
class Shape {
  /**
   * 构造函数
   */
  constructor() {
    this.type = "shape"
  }

  /**
   * 计算面积
   * @returns {number} 面积
   * @throws {Error} 子类必须实现此方法
   */
  getArea() {
    // TODO: 计算面积（子类需要重写）
    throw new Error("getArea method must be implemented")
  }

  /**
   * 计算周长
   * @returns {number} 周长
   * @throws {Error} 子类必须实现此方法
   */
  getPerimeter() {
    // TODO: 计算周长（子类需要重写）
    throw new Error("getPerimeter method must be implemented")
  }
}

/**
 * 圆形类
 * 继承自Shape，实现圆形的面积和周长计算
 */
class Circle extends Shape {
  /**
   * 构造函数
   * @param {number} radius - 半径
   */
  constructor(radius) {
    super()
    this.type = "circle"
    this.radius = radius
  }

  /**
   * 计算圆形面积
   * @returns {number} 面积
   */
  getArea() {
    // TODO: 计算圆形面积
    // 提示：π * r²
  }

  /**
   * 计算圆形周长
   * @returns {number} 周长
   */
  getPerimeter() {
    // TODO: 计算圆形周长
    // 提示：2 * π * r
  }
}

/**
 * 矩形类
 * 继承自Shape，实现矩形的面积和周长计算
 */
class Rectangle extends Shape {
  /**
   * 构造函数
   * @param {number} width - 宽度
   * @param {number} height - 高度
   */
  constructor(width, height) {
    super()
    this.type = "rectangle"
    this.width = width
    this.height = height
  }

  /**
   * 计算矩形面积
   * @returns {number} 面积
   */
  getArea() {
    // TODO: 计算矩形面积
    // 提示：width * height
  }

  /**
   * 计算矩形周长
   * @returns {number} 周长
   */
  getPerimeter() {
    // TODO: 计算矩形周长
    // 提示：2 * (width + height)
  }
}

/**
 * 三角形类
 * 继承自Shape，实现三角形的面积和周长计算
 */
class Triangle extends Shape {
  /**
   * 构造函数
   * @param {number} base - 底边长度
   * @param {number} height - 高度
   * @param {number} side1 - 第一条边长度
   * @param {number} side2 - 第二条边长度
   */
  constructor(base, height, side1, side2) {
    super()
    this.type = "triangle"
    this.base = base
    this.height = height
    this.side1 = side1
    this.side2 = side2
  }

  /**
   * 计算三角形面积
   * @returns {number} 面积
   */
  getArea() {
    // TODO: 计算三角形面积
    // 提示：(base * height) / 2
  }

  /**
   * 计算三角形周长
   * @returns {number} 周长
   */
  getPerimeter() {
    // TODO: 计算三角形周长
    // 提示：base + side1 + side2
  }
}

module.exports = { ShapeFactory, Shape, Circle, Rectangle, Triangle }
